package com.vshop.mapper.alast;

import com.vshop.entity.alast.common.*;
import com.vshop.entity.aspecial.common.PartnerSpecialDeviceLifecycle;
import com.vshop.entity.comentity.UserEmailAndDeviceSubscribeInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
/**
 * 所有的业务逻辑数据库操作类
 *
 * @author lm
 * @date 2020/6/9 17:31
 */
public interface LogicProcessesMapper {

    /**
     * 查询企业是否具有正在使用（启用）的方案
     *
     * @param partnerCode
     * @return
     */
    List<PartnerConfigContent> queryPlan(@Param("partnerCode") String partnerCode);

    /**
     * 小批量：查询企业是否具有正在使用方案（启用）的订购套餐
     *
     * @param partnerCode
     * @return
     */
    List<PartnerConfigContent> queryPlanOrder(@Param("partnerCode") String partnerCode);

    /**
     * 根据企业和当前正在使用的方案查询语言设置
     *
     * @param partnerCode
     * @param configType
     * @param planCode
     * @return
     */
    List<PartnerConfigLang> queryLangType(@Param("partnerCode") String partnerCode,
                                          @Param("configType") String configType,
                                          @Param("planCode") String planCode);

    /**
     * 根据渠道编码，原始套餐编码，新建套餐编码 查询规格跟价格
     *
     * @param partnerCode
     * @param packageCode
     * @param servicePlanCode
     * @param type            '0'-multipleServicePlanPage请求；'1'-singleServicePlanPage请求
     * @return
     */
    List<PartnerServicePlanSpecPrice> querySpecPrice(@Param("partnerCode") String partnerCode,
                                                     @Param("packageCode") String packageCode,
                                                     @Param("servicePlanCode") String servicePlanCode,
                                                     @Param("type") String type);

    /**
     * 在数据库里面查询，当前订单请求是否存在
     *
     * @param partnerCode
     * @param deviceCode
     * @param packageCode
     * @param servicePlanCode
     * @param payId
     * @param orderNo
     * @return
     */
    Integer queryOrderCount(@Param("partnerCode") String partnerCode,
                            @Param("deviceCode") String deviceCode,
                            @Param("packageCode") String packageCode,
                            @Param("servicePlanCode") String servicePlanCode,
                            @Param("payId") String payId,
                            @Param("orderNo") String orderNo);

    /**
     * 在数据库生成下单记录
     *
     * @param record
     * @return
     */
    Integer buildOrderRecord(ServicePlanOrderRecord record);

    /**
     * 根据企业编码和套餐编码，查询原始套餐的基本信息
     *
     * @param partnerCode
     * @param packageCode
     * @return
     */
    PartnerPackage queryPackage(@Param("partnerCode") String partnerCode,
                                @Param("packageCode") String packageCode);

    /**
     * 查询某个企业是否具有某个方案某个语言
     *
     * @param partnerCode
     * @param configType
     * @param planCode
     * @param languageCode
     * @return
     */
    Integer queryLanguageCodeOrNot(@Param("partnerCode") String partnerCode,
                                   @Param("configType") String configType,
                                   @Param("planCode") String planCode,
                                   @Param("languageCode") String languageCode);

    /**
     * 根据基础信息匹配新建的套餐名称
     *
     * @param partnerCode
     * @param packageCode
     * @param languageType
     * @return
     */
    String queryServicePlanShowName(@Param("partnerCode") String partnerCode,
                                    @Param("packageCode") String packageCode,
                                    @Param("languageType") String languageType);

    /**
     * 根据渠道编码，新建套餐编码，套餐语言
     * 查询套餐列表
     *
     * @param partnerCode
     * @param servicePlanCode
     * @return
     */
    List<PartnerServicePlan> queryServicePlan(@Param("partnerCode") String partnerCode,
                                              @Param("servicePlanCode") String servicePlanCode);

    /**
     * 查询某个deviceCode是否已经成功订阅过
     *
     * @param partnerCode
     * @param deviceCode
     * @return
     */
    Integer querySubscribedOrNot(@Param("partnerCode") String partnerCode,
                                 @Param("deviceCode") String deviceCode);

    /**
     * 订阅消息或者异常消息提交
     *
     * @param info
     */
    void insertSubscribeInfo(UserEmailAndDeviceSubscribeInfo info);

    /**
     * 入库访问登录记录
     *
     * @param record
     * @return
     */
    Integer storageDeviceLoginRecord(PartnerAccessDeviceLoginRecord record);

    /**
     * 入库默认首页的访问记录
     *
     * @param record
     * @return
     */
    Integer storageHomePageRecord(PartnerAccessHomePageRecord record);

    /**
     * 入库点击"Multiple"的访问记录
     *
     * @param record
     * @return
     */
    Integer storageMultipleRecord(PartnerAccessMultipleRecord record);

    /**
     * 去查询一下本企业有没有需要套餐类型特殊假处理一下的
     *
     * @param partnerCode
     * @param packageType
     * @return
     */
    Integer specialHandleCount(@Param("partnerCode") String partnerCode,
                               @Param("packageType") String packageType);

    /**
     * 根据企业编码查询方案一需要展示的参数名称
     *
     * @param partnerCode
     * @return
     */
    String queryShowContent(@Param("partnerCode") String partnerCode);

    /**
     * 去指定的数据表里面根据条件取套餐数据列表
     *
     * @param tableName
     * @param partnerCode
     * @param deviceCode
     * @param languageType
     * @param tags
     * @return
     */
    List<PartnerServicePlan> queryServicePlanList(@Param("tableName") String tableName,
                                                  @Param("partnerCode") String partnerCode,
                                                  @Param("deviceCode") String deviceCode,
                                                  @Param("languageType") String languageType,
                                                  @Param("tags") String tags);

    /**
     * 不归属领科的卡片，匹配固定服务费套餐
     * <p>
     * 根据：企业编码，语言类型，套餐适用标识,区域
     *
     * @param partnerCode
     * @param languageType
     * @param tags
     * @param area
     * @return
     */
    List<PartnerServicePlan> queryServiceFeePlan(@Param("partnerCode") String partnerCode,
                                                 @Param("languageType") String languageType,
                                                 @Param("tags") String tags,
                                                 @Param("area") String area);

    /**
     * 查询特殊设备：
     * <p>
     * 某个企业的某个设备是否已经入库
     *
     * @param partnerCode
     * @param deviceCode
     * @param requestOrderId
     * @return
     */
    Integer querySpecialDevice(@Param("partnerCode") String partnerCode,
                               @Param("deviceCode") String deviceCode,
                               @Param("requestOrderId") String requestOrderId);

    /**
     * 查询特殊设备订单记录
     *
     * @param partnerCode
     * @param deviceCode
     * @param mark
     * @return
     */
    List<PartnerSpecialDeviceLifecycle> querySpecialOrderRecord(@Param("partnerCode") String partnerCode,
                                                                @Param("deviceCode") String deviceCode,
                                                                @Param("mark") String mark);

    /**
     * 根据 languageCode 获取多语言错误提示信息
     *
     * @param languageCode
     * @return
     */
    LangMultipleErrorMsg getLangMultipleErrorMsg(@Param("languageCode") String languageCode);

    /**
     * 查询价格需要特殊处理的表中是否有当前渠道编码和套餐编码的组合
     *
     * @param partnerCode
     * @param packageCode
     * @return
     */
    Integer specialPriceHandle(@Param("partnerCode") String partnerCode,
                               @Param("packageCode") String packageCode);

    /**
     * 查询设备上面是否有自动续费的订单记录
     *
     * @param partnerCode
     * @param deviceCode
     * @return
     */
    List<ServicePlanOrderAutoRenewalRecord> queryAutoRenewalRecord(@Param("partnerCode") String partnerCode,
                                                                   @Param("deviceCode") String deviceCode);

    /**
     * 查询有自动续费的订单的完整记录
     *
     * @param payId
     * @return
     */
    ServicePlanOrderRecord queryOrderRecord(@Param("payId") String payId);

    /**
     * 根据设备和某个订单好查询完整的自动续费订单信息
     *
     * @param partnerCode
     * @param deviceCode
     * @param payId
     * @return
     */
    ServicePlanOrderAutoRenewalRecord queryAutoRecord(@Param("partnerCode") String partnerCode,
                                                      @Param("deviceCode") String deviceCode,
                                                      @Param("payId") String payId);

    /**
     * 查询partnerCode这个企业是否已经升级为3.0
     *
     * @param partnerCode
     * @return
     */
    Integer queryUpgradedOrNot(@Param("partnerCode") String partnerCode);

    /**
     * 入库 点击礼物盒的记录 ：partner_gift_box_click_record_t
     *
     * @param giftBoxClick
     * @return
     */
    Integer insertGiftBoxClickRecord(PartnerGiftBoxClickRecord giftBoxClick);

    /**
     * 入库 去数据表中存储取消自动续费的服务和原因 ：partner_reason_for_cancel_record_t
     *
     * @param reason
     * @return
     */
    Integer insertReasonForCancelRecord(PartnerReasonForCancelRecord reason);

    /**
     * 查询 去数据匹配某个企业某个卡片的交易记录：service_plan_order_record_t
     *
     * @param partnerCode
     * @param deviceCode
     * @return
     */
    List<ServicePlanOrderRecord> queryTransactionHistory(@Param("partnerCode") String partnerCode,
                                                         @Param("deviceCode") String deviceCode);

    /**
     * 查询特殊设备(类似大阳的非领科卡片)订单记录 ：partner_aspecial_device_lifecycle_t
     *
     * @param partnerCode
     * @param deviceCode
     * @param mark
     * @param status
     * @return
     */
    List<PartnerSpecialDeviceLifecycle> querySpecialOrderByStatus(@Param("partnerCode") String partnerCode,
                                                                  @Param("deviceCode") String deviceCode,
                                                                  @Param("mark") String mark,
                                                                  @Param("status") String status);

    /**
     * 查询某个企业的某个原始套餐允不允许在前端展示给用户 ：partner_package_not_show_t
     * <p>
     * 结果>0   配置了就存在不允许展示
     * <p>
     * 结果<0   没有配置了不存在就允许展示
     *
     * @param partnerCode
     * @param packageCode
     * @return
     */
    Integer queryPackageShowOrNot(@Param("partnerCode") String partnerCode,
                                  @Param("packageCode") String packageCode);

    /**
     * 根据servicePlanCode与orderPeriod和autoRenewal查询商品套餐的规格和价格方案：partner_service_plan_spec_price_t
     *
     * @param servicePlanCode
     * @param specifications
     * @param autoRenewal
     * @return
     */

    PartnerServicePlanSpecPrice querySpecPricedByServicePlanCode(@Param("servicePlanCode") String servicePlanCode,
                                                                 @Param("specifications") String specifications,
                                                                 @Param("autoRenewal") String autoRenewal);
}
